//package com.jason.core.filter;
//
//import com.jason.core.config.Audience;
//import com.jason.core.exception.LoginException;
//import com.jason.core.support.HttpCode;
//import com.jason.core.util.JwtHelper;
//import io.jsonwebtoken.Claims;
//import org.springframework.beans.factory.BeanFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.web.context.support.WebApplicationContextUtils;
//import org.springframework.web.filter.GenericFilterBean;
//
//import javax.servlet.FilterChain;
//import javax.servlet.ServletException;
//import javax.servlet.ServletRequest;
//import javax.servlet.ServletResponse;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.io.IOException;
//
//@Configuration
//public class JwtFilter extends GenericFilterBean {
//
//    @Autowired
//    private Audience audience;
//
//    /**
//     *  Reserved claims（保留），它的含义就像是编程语言的保留字一样，属于JWT标准里面规定的一些claim。JWT标准里面定好的claim有：
//
//     iss(Issuser)：代表这个JWT的签发主体；
//     sub(Subject)：代表这个JWT的主体，即它的所有人；
//     aud(Audience)：代表这个JWT的接收对象；
//     exp(Expiration time)：是一个时间戳，代表这个JWT的过期时间；
//     nbf(Not Before)：是一个时间戳，代表这个JWT生效的开始时间，意味着在这个时间之前验证JWT是会失败的；
//     iat(Issued at)：是一个时间戳，代表这个JWT的签发时间；
//     jti(JWT ID)：是JWT的唯一标识。
//     * @param servletRequest
//     * @param servletResponse
//     * @param filterChain
//     * @throws IOException
//     * @throws ServletException
//     */
//    @Override
//    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//        final HttpServletRequest request = (HttpServletRequest) servletRequest;
//        final HttpServletResponse response = (HttpServletResponse) servletResponse;
//        //等到请求头信息authorization信息
//        final String authHeader = request.getHeader("Authorization");
//
//        if ("OPTIONS".equals(request.getMethod())) {
//            response.setStatus(HttpServletResponse.SC_OK);
//            filterChain.doFilter(servletRequest, servletResponse);
//        } else {
//
//            if (authHeader == null || !authHeader.startsWith("bearer;")) {
//                throw new LoginException((HttpCode.LOGIN_FAIL.msg()));
//            }
//            final String token = authHeader.substring(7);
//
//            try {
//                if(audience == null){
//                    BeanFactory factory = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
//                    audience = (Audience) factory.getBean("audience");
//                }
//                final Claims claims = JwtHelper.parseJWT(token,audience.getBase64Secret());
//                if(claims == null){
//                    throw new LoginException(HttpCode.LOGIN_FAIL.msg());
//                }
//                request.setAttribute("claims", claims);
//            } catch (final Exception e) {
//                throw new LoginException((HttpCode.LOGIN_FAIL.msg()));
//            }
//
//            filterChain.doFilter(servletRequest, servletResponse);
//        }
//    }
//}
